package com.baizhi.cglib;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CGLIBProxyTest {
    public static void main(String[] args) {

        final Actor actor = new Actor("刘亦菲");

        //新建增强器
        Enhancer enhancer = new Enhancer();

        /**
         * 设定接口
         * 此方法要求生成的动态代理额外实现指定的接口们，但是cglib
         * 动态代理不是靠接口实现的，所以可以不设置
         */
        //enhancer.setInterfaces(actor.getClass().getInterfaces());

        /**
         * 设置父类
         * 此处要传入被代理者的类，CGLIB是通过继承被代理者的类来持有和被代理者相同的方法的
         * 所以此方法必须设置
         */
        enhancer.setSuperclass(actor.getClass());

        /**
         * 设置回调函数
         * 为增强器设定回调函数，之后通过增强器生成的代理对象调用任何方法都会
         * 走到此回调函数中，实现调用真正被代理对象的方法的效果
         */
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

                System.out.println("检查是否预约");

                if(method.getName().equals("dance")){
                    System.out.println("给多少钱都不跳舞");
                    return null;
                }

                Actor ac = (Actor) method.invoke(actor, objects);

                if(method.getName().equals("eat")){
                    System.out.println("记录以下，某年某月某日"+ actor.getName() + "和某男子一起吃饭");
                }else if(method.getName().equals("sing")){
                    System.out.println("记录以下，某年某月某日"+ actor.getName() + "和某男子一起唱歌");
                }

                return ac;
            }
        });

        Actor 刘永超 = (Actor) enhancer.create();
        //刘永超.eat();
        //刘永超.film();
        刘永超.dance();

    }
}
